/**
 * 
 */
package com.mc.pinyin4j;

import org.apache.commons.lang3.StringUtils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * @author w.weizhen
 *
 */
public class PinyinUtil {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(getPinyin("haha你笑起来真好看", " "));
        System.out.println(getPinyinInitials("你笑起来真好看"));
    }
    
//    二、使用PinyinHelper处理汉语拼音格式：
//    方式一：toHanyuPinyinStringArray(中文汉字)方法处理汉语拼音格式，且该格式返回的是一个string字符串类型，输出为该汉字的所有读音。
//    方式二：toHanyuPinyinStringArray(中文汉字，HanyuPinyinOutputFormat对象)方法处理汉语拼音格式,且该格式返回的也是一个string字符串类型,将该字符的所有读音以指定的格式进行输出
//    三、创建HanyuPinyinOutputFormat对象用于处理汉语拼音输出格式
//    在该格式中可以设置：
//    1、设置汉语拼音的大小写：setCaseType()方法
//    HanyuPinyinCaseType.UPPERCASE：设置为大写
//    HanyuPinyinCaseType.LOWERCASE：设置为小写
//    2、设置字符V的显示方式：setVCharType()方法
//    HanyuPinyinVCharType.WITH_U_AND_COLON：显示为u:(默认)
//    HanyuPinyinVCharType.WITH_V ：显示为v
//    HanyuPinyinVCharType.WITH_U_UNICODE：显示为ü
//    3、设置汉语拼音的声调：setToneType()方法
//    HanyuPinyinToneType.WITH_TONE_NUMBER：设置数字声调(默认)
//    HanyuPinyinToneType.WITHOUT_TONE：设置不显示声调
//    HanyuPinyinToneType.WITH_TONE_MARK：设置显示声调，前提必须设置V如何显示
    
    /**
     * 将汉字转换为全拼
     *
     * @param text 文本
     * @param separator 分隔符
     * @return {@link String}
     */
    public static String getPinyin(String text, String separator) {
      char[] chars = text.toCharArray();
      HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
      // 设置大小写
      format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
      // 设置声调表示方法
      format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
      // 设置字母u表示方法
      format.setVCharType(HanyuPinyinVCharType.WITH_V);
      String[] s;
      String rs = StringUtils.EMPTY;
      try {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
          // 判断是否为汉字字符
          if (String.valueOf(chars[i]).matches("[\\u4E00-\\u9FA5]+")) {
            s = PinyinHelper.toHanyuPinyinStringArray(chars[i], format);
            if (s != null) {
              sb.append(s[0]).append(separator);
              continue;
            }
          }
          sb.append(String.valueOf(chars[i]));
          if ((i + 1 >= chars.length) || String.valueOf(chars[i + 1]).matches("[\\u4E00-\\u9FA5]+")) {
            sb.append(separator);
          }
        }
        rs = sb.substring(0, sb.length() - 1);
      } catch (BadHanyuPinyinOutputFormatCombination e) {
        e.printStackTrace();
      }
      return rs;
    }

    /**
     * 获取汉字首字母
     *
     * @param text 文本
     * @return {@link String}
     */
    public static String getPinyinInitials(String text) {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < text.length(); i++) {
        char ch = text.charAt(i);
        String[] s = PinyinHelper.toHanyuPinyinStringArray(ch);
        if (s != null) {
          sb.append(s[0].charAt(0));
        } else {
          sb.append(ch);
        }
      }
      return sb.toString();
    }
}